package Rechner;

/*
 *  notwendige Importanweisungen
 */
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileWriter;

import javax.swing.JFileChooser;
import javax.swing.JTextField;

public class GUIListener implements ActionListener { 
	/*
	 * der GUILIstener soll auf den ActionListener zurückgreifen
	 */
	GUI gui;  
	/*
	 * Referenzerzeugung
	 */

	GUIListener(GUI gui) {
		this.gui = gui;
	}

	/*
	 *  Methode evaluiert das richtige Ziel-Feld, das für die Eingabe verwendet werden soll
	 *  abhängig davon in welchem Feld schon was steht oder welches Feld gerade aktiv ist
	 */
	private JTextField evaluateTargetField(CalculatorButton pushedButton) {
		JTextField targetField = null;
		/*
		 *  wenn das erste oder das zweite Feld gerade in der GUI aktiviert sind, dann nimm das entsprechende
		 */
		if (gui.firstInputField.isFocusOwner() || gui.secondInputField.isFocusOwner()) {
			if (gui.firstInputField.isFocusOwner()) {
				targetField = gui.firstInputField;
			}
			if (gui.secondInputField.isFocusOwner()) {
				targetField = gui.secondInputField;
			}
		} else {
			if (pushedButton == gui.zeroButton || pushedButton == gui.oneButton || pushedButton == gui.twoButton || pushedButton == gui.threeButton || pushedButton == gui.fourButton || pushedButton == gui.fiveButton || pushedButton == gui.sixButton || pushedButton == gui.sevenButton || pushedButton == gui.eightButton || pushedButton == gui.nineButton || pushedButton == gui.dotButton || pushedButton == gui.plusMinusButton) {
				/*
				 * das Operator Feld ist leer, dann Ausgabe im ersten Eingabefeld
				 */
				if (gui.operatorField.getText().equals("")) {
					targetField = gui.firstInputField;
				/*
				 *  oder eben nicht leer, dann Ausgabe im zweiten Eingabefeld
				 */
				} else {
					targetField = gui.secondInputField;
				}
			}
			/*
			 *  wenn die Operatoren Button gedrückt werden, dann wird das entsprechende Zeichen angezeigt
			 */
			if (pushedButton == gui.moduloButton || pushedButton == gui.multiplyButton || pushedButton == gui.divideButton || pushedButton == gui.plusButton || pushedButton == gui.minusButton) {
				if (!gui.firstInputField.getText().equals("")) {
					targetField = gui.operatorField;
				}
			}
		}
		return targetField;
	}
	
	/*
	 *  bei Drücken eines Buttons wird der Zahlenwert im entsprechendem Ein- bzw. Ausgabefeld angezeigt(non-Javadoc)
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	public void actionPerformed(ActionEvent ae) {
		String oldText = null;
		String newText = null;
		JTextField targetField = evaluateTargetField((CalculatorButton)ae.getSource());
		if (targetField != null) {
			if (ae.getSource() == gui.zeroButton) {
				targetField.setText(targetField.getText() + "0");
			}
			if (ae.getSource() == gui.oneButton) {
				targetField.setText(targetField.getText() + "1");
			}
			if (ae.getSource() == gui.twoButton) {
				targetField.setText(targetField.getText() + "2");
			}
			if (ae.getSource() == gui.threeButton) {
				targetField.setText(targetField.getText() + "3");
			}
			if (ae.getSource() == gui.fourButton) {
				targetField.setText(targetField.getText() + "4");
			}
			if (ae.getSource() == gui.fiveButton) {
				targetField.setText(targetField.getText() + "5");
			}
			if (ae.getSource() == gui.sixButton) {
				targetField.setText(targetField.getText() + "6");
			}
			if (ae.getSource() == gui.sevenButton) {
				targetField.setText(targetField.getText() + "7");
			}
			if (ae.getSource() == gui.eightButton) {
				targetField.setText(targetField.getText() + "8");
			}
			if (ae.getSource() == gui.nineButton) {
				targetField.setText(targetField.getText() + "9");
			}
			if (ae.getSource() == gui.dotButton) {
				oldText = targetField.getText();
				if (oldText.indexOf('.') == -1) {
					newText = oldText + ".";
				} else {
					/*
					 * der String enthält schon einen Punkt
					 */
					newText = oldText;
				}
				targetField.setText(newText);
			}
			/*
			 *  Falls der +/- Button gedrückt wird, wird überprüft ob ein "-" angezeigt werden muss oder dieses verschwinden muss
			 */
			if (ae.getSource() == gui.plusMinusButton) {
				oldText = targetField.getText();
				if (oldText.length() == 0) {
					newText = "-";
				} else {
					if (oldText.charAt(0) == '-') {
						newText = oldText.substring(1, oldText.length());
					} else {
						newText = "-" + oldText;
					}
				}
				targetField.setText(newText);
			}

			if (ae.getSource() == gui.moduloButton) {
				targetField.setText("mod");
			}
			if (ae.getSource() == gui.multiplyButton) {
				targetField.setText("*");
			}
			if (ae.getSource() == gui.divideButton) {
				targetField.setText("/");
			}
			if (ae.getSource() == gui.plusButton) {
				targetField.setText("+");
			}
			if (ae.getSource() == gui.minusButton) {
				targetField.setText("-");
			}
			
		} else {
			/*
			 *  Übergabe der Werte aus den Eingabefeldern in das "Historyfeld"
			 */
			if (ae.getSource() == gui.calculateButton) {
				String firstString = gui.firstInputField.getText();
				String secondString = gui.secondInputField.getText();
				String operatorString = gui.operatorField.getText();
				String oldHistory = gui.historyField.getText();
				if (!operatorString.equals(" ") && !operatorString.equals("")) {
					if (!firstString.equals("") && !secondString.equals("")) {
						String calculatedResult = Calculation.calculate(firstString, secondString, operatorString);
						String newHistory = oldHistory + firstString + " " + operatorString + " " + secondString + " = " + calculatedResult + "\r\n";
						gui.operatorField.setText(" ");
						gui.secondInputField.setValue(null);
						gui.historyField.setText(newHistory);
						if (calculatedResult.equals("undefined")) {
							gui.firstInputField.setValue(null);
						} else {
							gui.firstInputField.setText(calculatedResult);
							/*
							 * Die folgenden zwei Zeilen setzen den Fokus in der GUI zuerst auf das obere, dann auf das untere Eingabefeld
							 * Sinn und Zweck: Der Zahlenwert im ersten Einagbefeld wird mit den Bedingungen des DecimalFormat() neu formatiert
							 *
							 */
							gui.firstInputField.requestFocus();
							gui.secondInputField.requestFocus();
						}
					}
				}
			}
			/*
			 *  durch Betätigen des "clear-buttons" werden die Textfelder geleert bzw deren Werte zurückgesetzt
			 */
			if (ae.getSource() == gui.clearButton) {
				gui.firstInputField.setValue(null);
				gui.operatorField.setText(null);
				gui.secondInputField.setValue(null);
			}
			/*
			 *  durch Betätigen des "save-Buttons" werden die Vorgänge zum Abspeichern der Rechnungen in Gang gesetzt
			 */
			if (ae.getSource() == gui.exportButton) {
				JFileChooser targetFileChooser = new JFileChooser();
			    int returnValue = targetFileChooser.showSaveDialog(null);
			    if (returnValue == JFileChooser.APPROVE_OPTION) {
			        try {
			        	FileWriter fw = new FileWriter(targetFileChooser.getSelectedFile() + ".txt");
			            String historyText = gui.historyField.getText();
			            historyText = historyText.substring(36, historyText.length());
			        	fw.write(historyText);
			            fw.close();
			        } catch (Exception e) {
			            e.printStackTrace();
			        }
			    }
			}
			
			/*
			 *  durch Betätigen des "backspace-Buttons" wird das zuletzt eingegebene Zeichen gelöscht
			 */
			if (ae.getSource() == gui.backspaceButton) {
				/*
				 *  Auswahl, wo wurde das letzte Zeichen eingegeben?!
				 */
				if (gui.operatorField.getText().equals("") || gui.operatorField.getText() == null) {
					if (gui.firstInputField.getText().length() > 0) {
						gui.firstInputField.setText(gui.firstInputField.getText().substring(0, gui.firstInputField.getText().length()-1));						
					}
				} else {
					if (gui.secondInputField.getText().length() > 0) {
						gui.secondInputField.setText(gui.secondInputField.getText().substring(0, gui.secondInputField.getText().length()-1));
					} else {
						gui.operatorField.setText(null);
					}
				}
			}
		}
	}
}